﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio;
using System.Data.Objects;
using Excepciones;

namespace Servicios
{
    public class FuncionalidadServiceDataBaseImpl : GenericService<Funcionalidad>, IFuncionalidadService
    {
        private static FuncionalidadServiceDataBaseImpl instancia = new FuncionalidadServiceDataBaseImpl();

        private FuncionalidadServiceDataBaseImpl() : base() { }

        public static FuncionalidadServiceDataBaseImpl ObtenerInstancia()
        {
            return instancia;
        }

        public IList<Funcionalidad> ObtenerFuncionalidadesPorIdRol(int idRol)
        {
            using (DominioContainer ctx = new DominioContainer())
            {
                List<Funcionalidad> funcionalidades = new List<Funcionalidad>();
                try
                {
                    var query = from role in ctx.Roles
                                where role.Id == idRol
                                select role.Funcionalidades;

                    foreach (var funcRol in query)
                    {
                        foreach (var func in funcRol)
                        {
                            funcionalidades.Add(func);
                        }
                    }
                    return funcionalidades;
                }
                catch (Exception ex)
                {
                    throw new DataBaseException("Rol no existente en la base de datos.");
                }

            }
        }

        protected override ObjectSet<Funcionalidad> GetObjectSet(DominioContainer ctx)
        {
            return ctx.Funcionalidades;
        }


        public void Modificar(Funcionalidad funcionalidad)
        {
            using (DominioContainer ctx = new DominioContainer())
            {
                Funcionalidad fun = null;
                try
                {
                    fun = ctx.Funcionalidades.First(f => f.Id == funcionalidad.Id);
                }
                catch (Exception ex)
                {
                    throw new DataBaseException("Funcionalidad no existente en la base de datos.");
                }
                if (fun == null)
                {
                    throw new DataBaseException("No existe una funcionalidad con id " + funcionalidad.Id + " en la base de datos.");
                }
                fun.Nombre = funcionalidad.Nombre;
                ctx.SaveChanges();
            }
        }

        public Funcionalidad ObtenerPorId(int id)
        {
            using (DominioContainer ctx = new DominioContainer())
            {
                try
                {
                    Funcionalidad funcionalidad = ctx.Funcionalidades.First(f => f.Id == id);
                    return funcionalidad;
                }
                catch (Exception ex)
                {
                    throw new DataBaseException();
                }
            }
        }
    }
}
